import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
import java.util.Set;

public class ValidLetterHeterotopes {
    /*
    * 有效的字母异位词
    * 给定两个字符串 s 和 t ，编写一个函数来判断 t 是否是 s 的字母异位词。
    * 注意：若 s 和 t 中每个字符出现的次数都相同，则称 s 和 t 互为字母异位词。
    * 所给数据只包含小写字母
    * */
    public static void main(String[] args){
        ValidLetterHeterotopes validLetterHeterotopes = new ValidLetterHeterotopes();
        System.out.println(validLetterHeterotopes.mySolution("",
                ""));
    }

    // 我的想法：用hashmap来判断重复元素
    public boolean mySolution(String s, String t){
        // 首先排除长度不相等的情况
        if(s.length()!=t.length())
            return false;
        // s的字符全放入hashmap中,统计出现次数
        Map<Character, Integer> map = new HashMap<>(32);
        for (int i = 0; i < s.length(); i++) {
            Integer value = map.get(s.charAt(i));
            map.put(s.charAt(i),value==null? 1 : value+1);
        }
        for (int i = 0; i < t.length(); i++) {
            Integer value = map.get(t.charAt(i));
            if(value == null)
                return false;
            map.put(t.charAt(i),value-1);
        }
        for (Character c : map.keySet()){
            if(map.get(c) != 0)
                return false;
        }
        return true;
    }

    // 直接用数组来装，因为只会出现26个小写字母，一个26容量的数组即可，用来记录出现次数
    // 先遍历s, 每个字母出现一次就+1, 再遍历t, 每个字母出现一次就-1
    // 最后判断数组中每个数是不是0
    public boolean solution(String s, String t){
        int[] hash = new int[26];
        // 先便利s
        for (int i = 0; i < s.length(); i++) {
            hash[s.charAt(i)-'a']++;
        }
        for (int i = 0; i < t.length(); i++) {
            hash[t.charAt(i)-'a']--;
        }
        for (int i = 0; i < hash.length; i++) {
            if (hash[i] != 0)
                return false;
        }
        return true;
    }
}
